package ejb;

import ejb.soportes.Consulta;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class ConsultaUniversalFacade implements ConsultaUniversalFacadeLocal {

    @PersistenceContext(unitName = "SGR-ejbPU")
    private EntityManager em;

    private EntityManager getEntityManager() {
        return em;
    }
    
    /**
     * Se le pasa como parametro la consulta y te devuelve un solo Objeto.
     * Si el resultado es una lista te devuelve el primero que encuentra
     * @param consulta
     * @return
     * @throws Exception 
     */
    @Override
    public Object consultarSimpleResult(Consulta consulta) throws Exception {
        return consultarSimpleResult(consulta, new int[]{0, 1});
    }

    /**
     * Se le envia como parametros la consulta y el rango da como resultado una
     * lista. 
     * @param consulta
     * @param rango un array de integers con la cantidad inicial de registros y 
     * la cantidad final.
     * @return
     * @throws Exception 
     */
    @Override
    public Object consultarSimpleResult(Consulta consulta, int[] rango) throws Exception {
        List objs = consultar(consulta, rango);
        if (objs != null) {
            if (objs.size() > 0) {
                return objs.get(0);
            }
        }
        return null;
    }

    /**
     * Se le pasa como parametro la consulta y te devuelve una lista.
     * @param consulta
     * @return
     * @throws Exception 
     */
    @Override
    public List consultar(Consulta consulta) throws Exception {
        int[] rango = new int[]{-1, -1};
        return consultar(consulta, rango);
    }

    @Override
    public List consultar(Consulta consulta, int[] rango) throws Exception {
        return ejecutarConsulta(consulta.toString(), rango);
    }

    /**
     * Se le envia una consulta, unrango y duevuelve una lista
     * @param consulta debe ser un JPQL 
     * @param rango
     * @return
     * @throws Exception 
     */
    @Override
    public List ejecutarConsulta(String consulta, int[] rango) throws Exception {
        javax.persistence.Query q = getEntityManager().createQuery(consulta);
        if (rango[0] >= 0 && rango[1] >= 0) {
            q.setMaxResults(rango[1] - rango[0]);
            q.setFirstResult(rango[0]);
        }
        return q.getResultList();
    }

    /**
     * Devuelve un int con la cantidad total de registros de la consulta
     * @param consulta 
     * @return
     * @throws Exception 
     */
    @Override
    public int contarConsulta(Consulta consulta) throws Exception {
        javax.persistence.Query q = getEntityManager().createQuery(consulta.countToString());
        return Integer.valueOf(q.getSingleResult().toString());
    }

    /**
     * Dada una clase devuelve todos los registros existentes de la misma
     * @param clase
     * @return
     * @throws Exception 
     */
    @Override
    public int contarTodo(Class clase) throws Exception {
        String consulta = "SELECT COUNT (x) FROM " + clase.getSimpleName() + " x";
        javax.persistence.Query q = getEntityManager().createQuery(consulta);
        return Integer.valueOf(q.getSingleResult().toString());
    }
}
